package com.sam.example2.server;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.charset.Charset;

import org.apache.mina.core.service.IoAcceptor;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.filter.logging.LoggingFilter;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.sam.example2.adapter.CalculatorHandler;

public class CalculatorServer {
	private static final int PORT = 10010;

	private static final Logger LOGGER = LoggerFactory.getLogger(CalculatorServer.class);

	public static void main(String[] args) throws IOException {
		IoAcceptor acceptor = new NioSocketAcceptor();

		//添加IO过滤器
		acceptor.getFilterChain().addLast("logger", new LoggingFilter());
		acceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));
		
		// 设置I/O处理器
		acceptor.setHandler(new CalculatorHandler());
		/**
		 * I/O 接受器用来接受连接，与对等体（客户端）进行通讯，并发出相应的 I/O 事件交给 I/O 处理器来处理。
		 * 使用 I/O 接受器的时候，只需要调用bind方法并指定要监听的套接字地址。
		 * 当不再接受连接的时候，调用unbind停止监听即可。 
		 */
		acceptor.bind(new InetSocketAddress(PORT));

		LOGGER.info("计算器服务已启动，端口是" + PORT);
	}
}
